跳至主要内容

2.4 链上合约

因为根据解锁脚本+赎回脚本的方式确定NOTE写的数据区域,在数据区域之外可以使用包括多重签名,哈希锁在内的复杂脚本。

2.4.1 多签

使用类似下面的合约可以实现多签

  • 锁定脚本: NOTE OP_2DROP OP_2DROP OP_2DROP <m> <A pubkey> [B pubkey] [C pubkey...] <n> OP_CHECKMULTISIG
  • 解锁脚本: OP_0 <A sig> [B sig] [C sig...] DATA0 DATA1 DATA2 DATA3 Flag 也可以构造正确的赎回脚本使用P2SH/P2WSH/P2TR进行多签。

2.4.2 复杂合约

通过更加复杂的锁定脚本可以创建链上智能合约,只有满足合约条件的交易才能上链。下面是一个简单的哈希锁示例,此段脚本实现了要求提供除了签名之外的特定message才能发起交易,让信息上链。

class HashLock extends SmartContract {
@prop()
static note: ByteString = toByteString('NOTE', true)

@prop()
pubKey: PubKey

@prop()
hash: ByteString

constructor(pubKey: PubKey, hash: Sha256) {
super(...arguments)
this.pubKey = pubKey
this.hash = hash
}

@method()
public unlock(
sig: Sig,
message: ByteString,
data0: ByteString,
data1: ByteString,
data2: ByteString,
data3: ByteString,
data4: ByteString
) {
Scryptdemo.note
assert(sha256(message) == this.hash, 'Hash does not match')
assert(this.checkSig(sig, this.pubKey), 'signature check failed')
}
}

编译后的脚本为

044e4f54450000<pubKey><hash>78547a7572537a76537a7577775279755879a8788859795279ac77777777777777777777

ASM为

4e4f5445 0 0 <pubKey> <hash> OP_OVER OP_4 OP_ROLL OP_DROP OP_2SWAP OP_3 OP_ROLL OP_DUP OP_3 OP_ROLL OP_DROP OP_NIP OP_NIP OP_2 OP_PICK OP_DROP OP_8 OP_PICK OP_SHA256 OP_OVER OP_EQUALVERIFY OP_9 OP_PICK OP_2 OP_PICK OP_CHECKSIG OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP

示例合约使用sCrypt高级比特币脚本语言制作。 无论是最简单的脚本还是复杂的合约,在由解锁脚本和赎回/锁定脚本构成的交易脚本中,数据的格式和顺序都必须遵循本协议的规定。